This is a document describing Kara’s initial exploration of the data from Packets 1-3.
These packets included 29 scales or subscales, including the following:
- Absorption (Tellegen); range: 0 to 34
- Absorption extra (a handful of extra questions extra questions); range: 0 to 4
- Daily spiritual experiences #1-4 (Underwood & Teresi); range: 0 to 20
- Daily spiritual experiences #5-14 (Underwood & Teresi); range: 0 to 50
- Daily spiritual experiences #5-14 (Thai) (additional questions asked only in Thailand); range: 0 to 60
- Daily spiritual experiences #15-16 (Underwood & Teresi); range: 0 to 10
- Daily spiritual experiences #15-16 (Thai) (additional questions asked only in Thailand); range: 0 to 30
- Spiritual events (Luhrmann); range: 0 to 88
- Sensory seeking (Brown et al.); range: -28 to 28
- Body awareness (Shields et al.); range: -36 to 36
- Attention to feelings (Salovey et al.); range: -42 to 42
- Hallucination (Alderson-Day); range: 0 to 27
- VISQ: dialogic speech (McCarthy-Jones & Fernyhough); range: -8 to 8
- VISQ: inner speech (McCarthy-Jones & Fernyhough); range: -10 to 10
- VISQ: evaluative/motivational speech (McCarthy-Jones & Fernyhough); range: -8 to 8
- Inner speech (Hardy/Bentall); range: -20 to 20
- Hearing events (Posey & Losch); range: 0 to 18
- Encoding style (Lewicki); range: 0 to 40
- Mind metaphors (Van Elk); range: -16 to 16
- Metacognition: lack of cognitive confidence (Wells et al.); range: -12 to 12
- Metacognition: positive beliefs re: worrying (Wells et al.); range: -12 to 12
- Metacognition: cognitive self-consciousness (Wells et al.); range: -12 to 12
- Metacognition: uncontrollability/danger (Wells et al.); range: -12 to 12
- Metacognition: need to control thoughts (Wells et al.); range: -12 to 12
- Dualism: mental states (Weisman); range: 0 to 8
- Dualism: life events (Weisman); range: 0 to 5
- Dualism: inanimate consciousness (Weisman); range: 0 to 6
- Dualism: minds, selves, & world (Weisman); range: 0 to 9
- Dualism: epistemology (Weisman); range: 0 to 5
Means by site
First, let’s compare the mean responses to each subscale across the 5 sites. I’ll plot each subscale in a separate mini-plot (denoted in the title of each mini-plot). The x-axis and color denote the site (US, Ghana, Thailand, China, or Vanuatu). Note the the range y-axis varies between mini-plots. The dot shows what the mean response was for that subscale for that site, and the error bars show a 95% confidence interval for that mean.
Joining, by = c("ctry", "packet", "subscale")

Cluster analysis
… of sites
Now let’s try a formal analysis for determining how similar these 5 sites are to each other.
Hierarchical clustering basically works like this: If there are 5 things - A, B, C, D, and E - this analysis will try to group pairs of like things together. E.g., first it might pair A and D together, then it will pretend that there are just 4 things - AD, B, C, and E. Then it might pair B and C together, and then pretend that there are just 3 things - AD, BC, and E. Then it might pair AD and BC together, and then pretend that there are just 2 things: ADBC and E. It will do this until there is just one “thing” left.
So to read this plot, look for the pairings. Sites that are on the same “branch” in this “dendrogram” showed similar patterns of means on the subscales. The closer together they are on that branch, the more similar they were.

… of subscales
Now let’s do the same thing for the subscales: Which subscales “hang together”?
To read this plot, again, look for the pairings. Subscales that are on the same “branch” in this “dendrogram” showed similar patterns of means across the 5 sites. The closer together they are on that branch, the more similar they were.

Look at correlations among subscales by site
Now let’s take a closer look at which subscales seem to “hang together,” by looking at the correlations between scales in their means for each site.
To read this plot, find one scale on the x-axis, and another scale on the y-axis. The value (and color) at that point in the grid shows you the correlation between these two subscale means across the 5 sites. The maximum possible correlation is +1 (red), and the minimum is -1 (blue).
I ordered the scales according to the cluster analysis we just did above, so you can see “patches” of scales that all tended to have similar patterns of means across sites.

Look at correlations among subscales by individuals
We could do the same thing thinking about individual participants instead of sites - but it’s important to keep in mind that most people didn’t fill out all 29 subscales! So we’ll focus on just looking at how the subscales within each packet (Packet 1, 2, or 3) “hang together” for the people who completed that packet.
As above, to read these plots, find one scale on the x-axis, and another scale on the y-axis. The value (and color) at that point in the grid shows you the correlation between these two subscale means across the 5 sites. The maximum possible correlation is +1 (red), and the minimum is -1 (blue). (Note that these scales are being presented in alphabetical order, not by any sort of clustering analysis.)
Packet 1
Setting row names on a tibble is deprecated.

Packet 2
Setting row names on a tibble is deprecated.

Packet 3
Setting row names on a tibble is deprecated.

All packets
Just for fun, here’s a look at the correlations among individual participants’ subscale scores across all scales. Note that some of these pairs of subscales probably have very few observations going into these correlations!! So take this with a grain of salt.
Setting row names on a tibble is deprecated.

Focusing on absorption & spiritual events
Let’s look at relationships between absorption & spiritual events across individual participants, but separating out by site. Tanya’s strong prediction would be that higher absorption (as captured by the Tellegen scale, exwl) would be correlated with more spiritual events (as indxed by the Luhrmann scale, spev).
Here’s a test for the overall correlation:
Pearson's product-moment correlation
data: exwl and spev
t = 8.3864, df = 485, p-value = 5.495e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.2757416 0.4310991
sample estimates:
cor
0.3558766
Looks like this prediction is born out by the data! Absorption was significantly positively correlated with reported spiritual events (\(r\) = 0.36, \(p\) = <0.001), accounting for approximately 13% of the variance in reported spirtual events.
Now let’s take a look at what’s going on in each site with a regression analysis:
| baserate (overall) |
17.54 |
0.53 |
33.1 |
<0.001 |
| baserate (ghana vs. overall) |
16.05 |
1.10 |
14.6 |
<0.001 |
| baserate (thailand vs. overall) |
-6.17 |
0.98 |
-6.3 |
<0.001 |
| baserate (china vs. overall) |
-10.79 |
1.01 |
-10.7 |
<0.001 |
| baserate (vanuatu vs. overall) |
4.88 |
1.19 |
4.1 |
<0.001 |
| absorption (overall) |
0.96 |
0.09 |
11.1 |
<0.001 |
| absorption (ghana vs. overall) |
0.47 |
0.16 |
3.0 |
0.003 |
| absorption (thailand vs. overall) |
-0.25 |
0.18 |
-1.4 |
0.154 |
| absorption (china vs. overall) |
-0.36 |
0.18 |
-2.0 |
0.044 |
| absorption (vanuatu vs. overall) |
0.23 |
0.19 |
1.2 |
0.230 |
These results indicate that, as predicted, there was a significant positive relationship between absorption and reported spiritual events, collapsing across sites (\(b\) = 0.96, \(p\) = <0.001). The relationship between absorption and spiritual events was particularly strong among participants in Ghana (\(b\) = 0.47, \(p\) = 0.003), and (perhaps) weaker than average among participants in China (\(b\) = -0.36, \(p\) = 0.044).
Note also that there are overall differences in the baserates for reporting spiritual events: Participants in Ghana and Vanuatu generally reported more than average (Ghana: \(b\) = 16.05, \(p\) = <0.001; Vanuatu: \(b\) = 4.88, \(p\) = <0.001), while participants in Thailand and China generally reported fewer than average (Thailand: \(b\) = -6.17, \(p\) = <0.001; China: \(b\) = -10.79, \(p\) = <0.001).
Here’s a visualization of these relationships:

Dualism
Here’s just some initial attempt to take a look at how the dualism questions hang together… more on this later.
Joining, by = "question"
Column `question` joining character vector and factor, coercing into character vector

LS0tCnRpdGxlOiAnU0MgZGF0YSBlbnRyeTogUGFja2V0cyAxLTMnCnN1YnRpdGxlOiAnS1cgaW5pdGlhbCBleHBsb3JhdGlvbiAodXBkYXRlZCB3aXRoIGRhdGEgZnJvbSAyMDE4LTAxLTMxKScKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgc2V0IHdvcmtpbmcgZGlyZWN0b3IKIyBzZXR3ZCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzLyIpCgojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KGdnZGVuZHJvKQoKIyBsb2FkIHF1ZXN0aW9uIGtleSAoaW5jbHVkaW5nIG1hbnVhbCByZXZlcnNlLWNvZGluZykKcXVlc3Rpb25fa2V5IDwtIHJlYWQuY3N2KCIvL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy90ZW1wbGV0b25fcGFja2V0cy9wYWNrZXRzMTIzL3BhY2tldHMxMjNfcXVlc3Rpb25fa2V5X2J5aGFuZC5jc3YiKQoKIyBsb2FkIGRhdGEKZF93aWRlIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXF1ZXN0aW9uX3dpZGUuY3N2IikgJT4lCiAgbXV0YXRlKGN0cnkgPSBmYWN0b3IoY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAiY2hpbmEiLCAidmFudWF0dSIpKSkKZF93aWRlX3N1YnNjYWxlIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXN1YnNjYWxlX3dpZGUuY3N2IikgJT4lCiAgbXV0YXRlKGN0cnkgPSBmYWN0b3IoY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAiY2hpbmEiLCAidmFudWF0dSIpKSkKZF9sb25nIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXF1ZXN0aW9uX2xvbmcuY3N2IikgJT4lCiAgbXV0YXRlKGN0cnkgPSBmYWN0b3IoY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAiY2hpbmEiLCAidmFudWF0dSIpKSkKZF9sb25nX3N1YnNjYWxlIDwtIHJlYWRfY3N2KCIuL3BhY2tldHMxMjNfZGF0YV9ieXN1YnNjYWxlX2xvbmcuY3N2IikgJT4lCiAgbXV0YXRlKGN0cnkgPSBmYWN0b3IoY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidXMiLCAiZ2hhbmEiLCAidGhhaWxhbmQiLCAiY2hpbmEiLCAidmFudWF0dSIpKSkKCiMgbWFrZSBjdXN0b20gZnVuY3Rpb25zCnJvdW5kMiA8LSBmdW5jdGlvbih4KSB7Zm9ybWF0KHJvdW5kKHgsIDIpLCBkaWdpdHMgPSAyKX0KYGBgCgpUaGlzIGlzIGEgZG9jdW1lbnQgZGVzY3JpYmluZyBLYXJhJ3MgaW5pdGlhbCBleHBsb3JhdGlvbiBvZiB0aGUgZGF0YSBmcm9tIFBhY2tldHMgMS0zLiAKClRoZXNlIHBhY2tldHMgaW5jbHVkZWQgYHIgbGVuZ3RoKGxldmVscyhmYWN0b3IoZF9sb25nX3N1YnNjYWxlJHN1YnNjYWxlKSkpIC0gMWAgc2NhbGVzIG9yIHN1YnNjYWxlcywgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6CgotICoqQWJzb3JwdGlvbioqIChUZWxsZWdlbik7IHJhbmdlOiAwIHRvIDM0Ci0gKipBYnNvcnB0aW9uIGV4dHJhKiogKGEgaGFuZGZ1bCBvZiBleHRyYSBxdWVzdGlvbnMgZXh0cmEgcXVlc3Rpb25zKTsgcmFuZ2U6IDAgdG8gNAotICoqRGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICMxLTQqKiAoVW5kZXJ3b29kICYgVGVyZXNpKTsgcmFuZ2U6IDAgdG8gMjAKLSAqKkRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAjNS0xNCoqIChVbmRlcndvb2QgJiBUZXJlc2kpOyByYW5nZTogMCB0byA1MAotICoqRGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICM1LTE0IChUaGFpKSoqIChhZGRpdGlvbmFsIHF1ZXN0aW9ucyBhc2tlZCBvbmx5IGluIFRoYWlsYW5kKTsgcmFuZ2U6IDAgdG8gNjAKLSAqKkRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAjMTUtMTYqKiAoVW5kZXJ3b29kICYgVGVyZXNpKTsgcmFuZ2U6IDAgdG8gMTAKLSAqKkRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlcyAjMTUtMTYgKFRoYWkpKiogKGFkZGl0aW9uYWwgcXVlc3Rpb25zIGFza2VkIG9ubHkgaW4gVGhhaWxhbmQpOyByYW5nZTogMCB0byAzMAotICoqU3Bpcml0dWFsIGV2ZW50cyoqIChMdWhybWFubik7IHJhbmdlOiAwIHRvIDg4Ci0gKipTZW5zb3J5IHNlZWtpbmcqKiAoQnJvd24gZXQgYWwuKTsgcmFuZ2U6IC0yOCB0byAyOAotICoqQm9keSBhd2FyZW5lc3MqKiAoU2hpZWxkcyBldCBhbC4pOyByYW5nZTogLTM2IHRvIDM2Ci0gKipBdHRlbnRpb24gdG8gZmVlbGluZ3MqKiAoU2Fsb3ZleSBldCBhbC4pOyByYW5nZTogLTQyIHRvIDQyCi0gKipIYWxsdWNpbmF0aW9uKiogKEFsZGVyc29uLURheSk7IHJhbmdlOiAwIHRvIDI3Ci0gKipWSVNROiBkaWFsb2dpYyBzcGVlY2gqKiAoTWNDYXJ0aHktSm9uZXMgJiBGZXJueWhvdWdoKTsgcmFuZ2U6IC04IHRvIDgKLSAqKlZJU1E6IGlubmVyIHNwZWVjaCoqIChNY0NhcnRoeS1Kb25lcyAmIEZlcm55aG91Z2gpOyByYW5nZTogLTEwIHRvIDEwCi0gKipWSVNROiBldmFsdWF0aXZlL21vdGl2YXRpb25hbCBzcGVlY2gqKiAoTWNDYXJ0aHktSm9uZXMgJiBGZXJueWhvdWdoKTsgcmFuZ2U6IC04IHRvIDgKLSAqKklubmVyIHNwZWVjaCoqIChIYXJkeS9CZW50YWxsKTsgcmFuZ2U6IC0yMCB0byAyMAotICoqSGVhcmluZyBldmVudHMqKiAoUG9zZXkgJiBMb3NjaCk7IHJhbmdlOiAwIHRvIDE4Ci0gKipFbmNvZGluZyBzdHlsZSoqIChMZXdpY2tpKTsgcmFuZ2U6IDAgdG8gNDAKLSAqKk1pbmQgbWV0YXBob3JzKiogKFZhbiBFbGspOyByYW5nZTogLTE2IHRvIDE2Ci0gKipNZXRhY29nbml0aW9uOiBsYWNrIG9mIGNvZ25pdGl2ZSBjb25maWRlbmNlKiogKFdlbGxzIGV0IGFsLik7IHJhbmdlOiAtMTIgdG8gMTIKLSAqKk1ldGFjb2duaXRpb246IHBvc2l0aXZlIGJlbGllZnMgcmU6IHdvcnJ5aW5nKiogKFdlbGxzIGV0IGFsLik7IHJhbmdlOiAtMTIgdG8gMTIKLSAqKk1ldGFjb2duaXRpb246IGNvZ25pdGl2ZSBzZWxmLWNvbnNjaW91c25lc3MqKiAoV2VsbHMgZXQgYWwuKTsgcmFuZ2U6IC0xMiB0byAxMgotICoqTWV0YWNvZ25pdGlvbjogdW5jb250cm9sbGFiaWxpdHkvZGFuZ2VyKiogKFdlbGxzIGV0IGFsLik7IHJhbmdlOiAtMTIgdG8gMTIKLSAqKk1ldGFjb2duaXRpb246IG5lZWQgdG8gY29udHJvbCB0aG91Z2h0cyoqIChXZWxscyBldCBhbC4pOyByYW5nZTogLTEyIHRvIDEyCi0gKipEdWFsaXNtOiBtZW50YWwgc3RhdGVzKiogKFdlaXNtYW4pOyByYW5nZTogMCB0byA4Ci0gKipEdWFsaXNtOiBsaWZlIGV2ZW50cyoqIChXZWlzbWFuKTsgcmFuZ2U6IDAgdG8gNQotICoqRHVhbGlzbTogaW5hbmltYXRlIGNvbnNjaW91c25lc3MqKiAoV2Vpc21hbik7IHJhbmdlOiAwIHRvIDYKLSAqKkR1YWxpc206IG1pbmRzLCBzZWx2ZXMsICYgd29ybGQqKiAoV2Vpc21hbik7IHJhbmdlOiAwIHRvIDkKLSAqKkR1YWxpc206IGVwaXN0ZW1vbG9neSoqIChXZWlzbWFuKTsgcmFuZ2U6IDAgdG8gNQoKIyBNZWFucyBieSBzaXRlCgpGaXJzdCwgbGV0J3MgY29tcGFyZSB0aGUgbWVhbiByZXNwb25zZXMgdG8gZWFjaCBzdWJzY2FsZSBhY3Jvc3MgdGhlIDUgc2l0ZXMuIEknbGwgcGxvdCBlYWNoIHN1YnNjYWxlIGluIGEgc2VwYXJhdGUgbWluaS1wbG90IChkZW5vdGVkIGluIHRoZSB0aXRsZSBvZiBlYWNoIG1pbmktcGxvdCkuIFRoZSB4LWF4aXMgYW5kIGNvbG9yIGRlbm90ZSB0aGUgc2l0ZSAoVVMsIEdoYW5hLCBUaGFpbGFuZCwgQ2hpbmEsIG9yIFZhbnVhdHUpLiBOb3RlIHRoZSB0aGUgcmFuZ2UgeS1heGlzIHZhcmllcyBiZXR3ZWVuIG1pbmktcGxvdHMuIFRoZSBkb3Qgc2hvd3Mgd2hhdCB0aGUgbWVhbiByZXNwb25zZSB3YXMgZm9yIHRoYXQgc3Vic2NhbGUgZm9yIHRoYXQgc2l0ZSwgYW5kIHRoZSBlcnJvciBiYXJzIHNob3cgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhhdCBtZWFuLiAKCmBgYHtyfQpkX2xvbmdfc3Vic2NhbGVfYm9vdCA8LSBkX2xvbmdfc3Vic2NhbGUgJT4lCiAgZmlsdGVyKCFpcy5uYShzdW1fc2NvcmUpKSAlPiUKICBncm91cF9ieShjdHJ5LCBwYWNrZXQsIHN1YnNjYWxlKSAlPiUKICBkbyhkYXRhLmZyYW1lKHJiaW5kKHNtZWFuLmNsLmJvb3QoLiRzdW1fc2NvcmUpKSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIoc3Vic2NhbGUgIT0gImF0dG4iKSAlPiUKICBsZWZ0X2pvaW4oZF9sb25nX3N1YnNjYWxlICU+JQogICAgICAgICAgICAgIGZpbHRlcighaXMubmEoc3VtX3Njb3JlKSkgJT4lCiAgICAgICAgICAgICAgY291bnQoY3RyeSwgcGFja2V0LCBzdWJzY2FsZSkpICU+JQogIG11dGF0ZShwYWNrZXQgPSBwYXN0ZSgicGFja2V0IiwgcGFja2V0KSwKICAgICAgICAgY3RyeSA9IGZhY3RvcihjdHJ5LAogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhaWxhbmQiLCAiY2hpbmEiLCAidmFudWF0dSIpKSwKICAgICAgICAgc3Vic2NhbGUgPSAKICAgICAgICAgICBmYWN0b3Ioc3Vic2NhbGUsCiAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImV4d2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh3bF9leHRyYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV8xdG80IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV81dG8xNCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc2VfNXRvMTRfdGhhaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzZV8xNXRvMTYiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHNlXzE1dG8xNl90aGFpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BldiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5fc2Vuc29yeV9zZWVraW5nIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbl9ib2R5X2F3YXJlbmVzcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZW5fdHJhaXRfbWV0YW1vb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXIyX2hhbGx1Y2luYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX1ZJU1FfZGlhbG9naWNfc3BlZWNoIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludm9fVklTUV9pbm5lcl9zcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX1ZJU1FfZXZhbF9tb3Rpdl9pbm5lcl9zcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZvX2hhcmR5X2JlbnRhbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXJfcG9zZXlfbG9zY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvX2xld2lja2kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhX3Zhbl9lbGsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXRfY29uZmlkZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF9wb3NpdGl2ZV9iZWxpZWZzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGF0X2NvZ25pdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF91bmNvbnRyb2xsYWJpbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhdF9uZWVkX2NvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X21lbnRhbF9zdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X2xpZmVfZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlud19pbmFuaW1hdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW53X3NlbHZlc19zb3Vsc193b3JsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbndfZXBpc3RlbWljIiksCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFic29ycHRpb24gKHRlbGxlZ2VuKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnNvcnB0aW9uIChleHRyYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXMgKCMxLTQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICgjNS0xNCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXMgKCM1LTE0IHRoYWkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICgjMTUtMTYpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzICgjMTUtMTYgdGhhaSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGlyaXR1YWwgZXZlbnRzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNvcnkgc2Vla2luZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZHkgYXdhcmVuZXNzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVudGlvbiB0byBmZWVsaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbGx1Y2luYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVklTUTogZGlhbG9naWMgc3BlZWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVklTUTogaW5uZXIgc3BlZWNoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVklTUTogZXZhbHVhdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlubmVyIHNwZWVjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYXJpbmcgZXZlbnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2Rpbmcgc3R5bGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5kIG1ldGFwaG9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBsYWNrIG9mIGNvZ25pdGl2ZSBjb25maWRlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNvZy46IHBvc2l0aXZlIGJlbGllZnMgcmU6IHdvcnJ5aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNvZy46IGNvZ25pdGl2ZSBzZWxmLWNvbnNjaW91c25lc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogdW5jb250cm9sbGFiaWxpdHkvZGFuZ2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNvZy46IG5lZWQgdG8gY29udHJvbCB0aG91Z2h0cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IG1lbnRhbCBzdGF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBsaWZlIGV2ZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IGluYW5pbWF0ZSBjb25zY2lvdXNuZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogbWluZHMsIHNlbHZlcywgJiB3b3JsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IGVwaXN0ZW1vbG9neSIpKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDR9CmdncGxvdChkX2xvbmdfc3Vic2NhbGVfYm9vdCAlPiUKICAgICAgICAgbXV0YXRlKHN1YnNjYWxlID0gCiAgICAgICAgICAgICAgICAgIGZhY3RvcihzdWJzY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IAogICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJhYnNvcnB0aW9uXG4odGVsbGVnZW4pXG5yYW5nZTogMCB0byAzNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic29ycHRpb25cbihleHRyYSlcbnJhbmdlOiAwIHRvIDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXNcbih1bmRlcndvb2QgJiB0ZXJlc2k7ICMxLTQpXG5yYW5nZTogMCB0byAyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlc1xuKHVuZGVyd29vZCAmIHRlcmVzaTsgIzUtMTQpXG5yYW5nZTogMCB0byA1MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhaWx5IHNwaXJpdHVhbCBleHBlcmllbmNlc1xuKGFkZCdsIHRoYWkgdmVyc2lvbnMgZm9yICM1LTE0KVxucmFuZ2U6IDAgdG8gNjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYWlseSBzcGlyaXR1YWwgZXhwZXJpZW5jZXNcbih1bmRlcndvb2QgJiB0ZXJlc2k7ICMxNS0xNilcbnJhbmdlOiAwIHRvIDEwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFpbHkgc3Bpcml0dWFsIGV4cGVyaWVuY2VzXG4oYWRkJ2wgdGhhaSB2ZXJzaW9ucyBmb3IgIzE1LTE2KVxucmFuZ2U6IDAgdG8gMzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGlyaXR1YWwgZXZlbnRzXG4obHVocm1hbm4pXG5yYW5nZTogMCB0byA4OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnNvcnkgc2Vla2luZ1xuKGJyb3duIGV0IGFsLilcbnJhbmdlOiAtMjggdG8gMjgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2R5IGF3YXJlbmVzc1xuKHNoaWVsZHMgZXQgYWwuKVxucmFuZ2U6IC0zNiB0byAzNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVudGlvbiB0byBmZWVsaW5nc1xuKHNhbG92ZXkgZXQgYWwuKVxucmFuZ2U6IC00MiB0byA0MiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbGx1Y2luYXRpb25cbihhbGRlcnNvbi1kYXkpXG5yYW5nZTogMCB0byAyNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZJU1E6IGRpYWxvZ2ljIHNwZWVjaFxuKG1jY2FydGh5LWpvbmVzICYgZmVybnlob3VnaClcbnJhbmdlOiAtOCB0byA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVklTUTogaW5uZXIgc3BlZWNoXG4obWNjYXJ0aHktam9uZXMgJiBmZXJueWhvdWdoKVxucmFuZ2U6IC0xMCB0byAxMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZJU1E6IGV2YWx1YXRpdmUvbW90aXZhdGlvbmFsIHNwZWVjaFxuKG1jY2FydGh5LWpvbmVzICYgZmVybnlob3VnaClcbnJhbmdlOiAtOCB0byA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5uZXIgc3BlZWNoXG4oaGFyZHkvYmVudGFsbClcbnJhbmdlOiAtMjAgdG8gMjAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFyaW5nIGV2ZW50c1xuKHBvc2V5ICYgbG9zY2gpXG5yYW5nZTogMCB0byAxOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIHN0eWxlXG4obGV3aWNraSlcbnJhbmdlOiAwIHRvIDQwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluZCBtZXRhcGhvcnNcbih2YW4gZWxrKVxucmFuZ2U6IC0xNiB0byAxNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBsYWNrIG9mIGNvZ25pdGl2ZSBjb25maWRlbmNlXG4od2VsbHMgZXQgYWwuKVxucmFuZ2U6IC0xMiB0byAxMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBwb3NpdGl2ZSBiZWxpZWZzIHJlOiB3b3JyeWluZ1xuKHdlbGxzIGV0IGFsLilcbnJhbmdlOiAtMTIgdG8gMTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogY29nbml0aXZlIHNlbGYtY29uc2Npb3VzbmVzc1xuKHdlbGxzIGV0IGFsLilcbnJhbmdlOiAtMTIgdG8gMTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhY29nLjogdW5jb250cm9sbGFiaWxpdHkvZGFuZ2VyXG4od2VsbHMgZXQgYWwuKVxucmFuZ2U6IC0xMiB0byAxMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1ldGFjb2cuOiBuZWVkIHRvIGNvbnRyb2wgdGhvdWdodHNcbih3ZWxscyBldCBhbC4pXG5yYW5nZTogLTEyIHRvIDEyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogbWVudGFsIHN0YXRlc1xuKHdlaXNtYW4pXG5yYW5nZTogMCB0byA4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVhbGlzbTogbGlmZSBldmVudHNcbih3ZWlzbWFuKVxucmFuZ2U6IDAgdG8gNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1YWxpc206IGluYW5pbWF0ZSBjb25zY2lvdXNuZXNzXG4od2Vpc21hbilcbnJhbmdlOiAwIHRvIDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBtaW5kcywgc2VsdmVzLCAmIHdvcmxkXG4od2Vpc21hbilcbnJhbmdlOiAwIHRvIDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWFsaXNtOiBlcGlzdGVtb2xvZ3lcbih3ZWlzbWFuKVxucmFuZ2U6IDAgdG8gNSIpKSkgJT4lCiAgICAgICAgICMgZmlsdGVyKCFncmVwbCgidGhhaSIsIHN1YnNjYWxlKSkgJT4lICMgZ2V0IHJpZCBvZiB0aGFpLW9ubHkgc2NhbGVzCiAgICAgICAgIG11dGF0ZShwYWNrZXQgPSBnc3ViKCJwYWNrZXQgIiwgIlAiLCBwYWNrZXQpKSwKICAgICAgIGFlcyh4ID0gY3RyeSwgeSA9IE1lYW4sIGNvbG9yID0gY3RyeSkpICsKICBmYWNldF93cmFwKH4gcmVvcmRlcihpbnRlcmFjdGlvbihwYWNrZXQsIHN1YnNjYWxlLCBzZXAgPSAiOiAiKSwKICAgICAgICAgICAgICAgICAgICAgICBhcy5udW1lcmljKGZhY3RvcihwYWNrZXQpKSksCiAgICAgICAgICAgICBuY29sID0gMywgc2NhbGVzID0gImZyZWUiKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gTG93ZXIsIHltYXggPSBVcHBlcikpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKCIobj0iLCBuLCAiKSIpLCB5ID0gTG93ZXIpLCAKICAgICAgICAgICAgc2l6ZSA9IDIsIG51ZGdlX3ggPSAwLjE1LCBoanVzdCA9IDApICsKICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwgMSkpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICBsYWJzKHRpdGxlID0gIm1lYW4gc3Vic2NhbGUgc2NvcmVzIGJ5IHNpdGUiLAogICAgICAgc3VidGl0bGUgPSAib3JkZXJlZCBieSBwYWNrZXQgKFAxLCBQMiwgUDMpXG5lcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIiwKICAgICAgIHggPSAic2l0ZSIsIGNvbG9yID0gInNpdGUiLAogICAgICAgeSA9ICJtZWFuIHN1YnNjYWxlIHNjb3JlIChyYW5nZSB2YXJpZXMgYnkgc3Vic2NhbGUpIikKYGBgCgojIENsdXN0ZXIgYW5hbHlzaXMKCmBgYHtyfQpjb3JfYnlfc2l0ZSA8LSBkX2xvbmdfc3Vic2NhbGVfYm9vdCAlPiUKICBmaWx0ZXIoIWdyZXBsKCJ0aGFpIiwgc3Vic2NhbGUpKSAlPiUgCiAgbXV0YXRlKHN1YnNjYWxlID0gaWZlbHNlKHN1YnNjYWxlID09ICJpbm5lciBzcGVlY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZShhcy5jaGFyYWN0ZXIoc3Vic2NhbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3ViKCJwYWNrZXQgIiwgInAiLCBwYWNrZXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXAgPSAiXyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoc3Vic2NhbGUpKSkgJT4lCiAgZGlzdGluY3QoY3RyeSwgc3Vic2NhbGUsIE1lYW4pICU+JQogIGZpbHRlcihzdWJzY2FsZSAhPSAiaW5uZXIgdm9pY2UiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgc3ByZWFkKHN1YnNjYWxlLCBNZWFuKSAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJjdHJ5IikKYGBgCgojIyAuLi4gb2Ygc2l0ZXMKCk5vdyBsZXQncyB0cnkgYSBmb3JtYWwgYW5hbHlzaXMgZm9yIGRldGVybWluaW5nIGhvdyBzaW1pbGFyIHRoZXNlIDUgc2l0ZXMgYXJlIHRvIGVhY2ggb3RoZXIuIAoKSGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgYmFzaWNhbGx5IHdvcmtzIGxpa2UgdGhpczogSWYgdGhlcmUgYXJlIDUgdGhpbmdzIC0gQSwgQiwgQywgRCwgYW5kIEUgLSB0aGlzIGFuYWx5c2lzIHdpbGwgdHJ5IHRvIGdyb3VwIHBhaXJzIG9mIGxpa2UgdGhpbmdzIHRvZ2V0aGVyLiBFLmcuLCBmaXJzdCBpdCBtaWdodCBwYWlyIEEgYW5kIEQgdG9nZXRoZXIsIHRoZW4gaXQgd2lsbCBwcmV0ZW5kIHRoYXQgdGhlcmUgYXJlIGp1c3QgNCB0aGluZ3MgLSBBRCwgQiwgQywgYW5kIEUuIFRoZW4gaXQgbWlnaHQgcGFpciBCIGFuZCBDIHRvZ2V0aGVyLCBhbmQgdGhlbiBwcmV0ZW5kIHRoYXQgdGhlcmUgYXJlIGp1c3QgMyB0aGluZ3MgLSBBRCwgQkMsIGFuZCBFLiBUaGVuIGl0IG1pZ2h0IHBhaXIgQUQgYW5kIEJDIHRvZ2V0aGVyLCBhbmQgdGhlbiBwcmV0ZW5kIHRoYXQgdGhlcmUgYXJlIGp1c3QgMiB0aGluZ3M6IEFEQkMgYW5kIEUuIEl0IHdpbGwgZG8gdGhpcyB1bnRpbCB0aGVyZSBpcyBqdXN0IG9uZSAidGhpbmciIGxlZnQuCgpTbyB0byByZWFkIHRoaXMgcGxvdCwgbG9vayBmb3IgdGhlIHBhaXJpbmdzLiBTaXRlcyB0aGF0IGFyZSBvbiB0aGUgc2FtZSAiYnJhbmNoIiBpbiB0aGlzICJkZW5kcm9ncmFtIiBzaG93ZWQgc2ltaWxhciBwYXR0ZXJucyBvZiBtZWFucyBvbiB0aGUgc3Vic2NhbGVzLiBUaGUgY2xvc2VyIHRvZ2V0aGVyIHRoZXkgYXJlIG9uIHRoYXQgYnJhbmNoLCB0aGUgbW9yZSBzaW1pbGFyIHRoZXkgd2VyZS4KCmBgYHtyLCBmaWcud2lkdGggPSAyLCBmaWcuYXNwID0gMC42fQpjbHVzdF9zaXRlcyA8LSBoY2x1c3QoZGlzdChjb3JfYnlfc2l0ZSkpCmdnZGVuZHJvZ3JhbShjbHVzdF9zaXRlcykgKwogIGxhYnModGl0bGUgPSAiaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgb2Ygc2l0ZXMiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgbWVhbiBzdWJzY2FsZSBzY29yZXMgYnkgc2l0ZSIpCmBgYAoKIyMgLi4uIG9mIHN1YnNjYWxlcwoKTm93IGxldCdzIGRvIHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgc3Vic2NhbGVzOiBXaGljaCBzdWJzY2FsZXMgImhhbmcgdG9nZXRoZXIiPyAKClRvIHJlYWQgdGhpcyBwbG90LCBhZ2FpbiwgbG9vayBmb3IgdGhlIHBhaXJpbmdzLiBTdWJzY2FsZXMgdGhhdCBhcmUgb24gdGhlIHNhbWUgImJyYW5jaCIgaW4gdGhpcyAiZGVuZHJvZ3JhbSIgc2hvd2VkIHNpbWlsYXIgcGF0dGVybnMgb2YgbWVhbnMgYWNyb3NzIHRoZSA1IHNpdGVzLiBUaGUgY2xvc2VyIHRvZ2V0aGVyIHRoZXkgYXJlIG9uIHRoYXQgYnJhbmNoLCB0aGUgbW9yZSBzaW1pbGFyIHRoZXkgd2VyZS4KCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC42fQpjbHVzdF9zdWJzY2FsZXMgPC0gaGNsdXN0KGRpc3QodChjb3JfYnlfc2l0ZSkpKQpnZ2RlbmRyb2dyYW0oY2x1c3Rfc3Vic2NhbGVzKSArCiAgbGFicyh0aXRsZSA9ICJoaWVyYXJjaGljYWwgY2x1c3RlciBvZiBzdWJzY2FsZXMiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgbWVhbiBzdWJzY2FsZSBzY29yZXMgYnkgc2l0ZSIpCmBgYAoKIyBMb29rIGF0IGNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzY2FsZXMgYnkgc2l0ZQoKTm93IGxldCdzIHRha2UgYSBjbG9zZXIgbG9vayBhdCB3aGljaCBzdWJzY2FsZXMgc2VlbSB0byAiaGFuZyB0b2dldGhlciwiIGJ5IGxvb2tpbmcgYXQgdGhlIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHNjYWxlcyBpbiB0aGVpciBtZWFucyBmb3IgZWFjaCBzaXRlLiAKClRvIHJlYWQgdGhpcyBwbG90LCBmaW5kIG9uZSBzY2FsZSBvbiB0aGUgeC1heGlzLCBhbmQgYW5vdGhlciBzY2FsZSBvbiB0aGUgeS1heGlzLiBUaGUgdmFsdWUgKGFuZCBjb2xvcikgYXQgdGhhdCBwb2ludCBpbiB0aGUgZ3JpZCBzaG93cyB5b3UgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlc2UgdHdvIHN1YnNjYWxlIG1lYW5zIGFjcm9zcyB0aGUgNSBzaXRlcy4gVGhlIG1heGltdW0gcG9zc2libGUgY29ycmVsYXRpb24gaXMgKzEgKHJlZCksIGFuZCB0aGUgbWluaW11bSBpcyAtMSAoYmx1ZSkuCgpJIG9yZGVyZWQgdGhlIHNjYWxlcyBhY2NvcmRpbmcgdG8gdGhlIGNsdXN0ZXIgYW5hbHlzaXMgd2UganVzdCBkaWQgYWJvdmUsIHNvIHlvdSBjYW4gc2VlICJwYXRjaGVzIiBvZiBzY2FsZXMgdGhhdCBhbGwgdGVuZGVkIHRvIGhhdmUgc2ltaWxhciBwYXR0ZXJucyBvZiBtZWFucyBhY3Jvc3Mgc2l0ZXMuCgpgYGB7ciwgZmlnLndpZHRoID0gNywgZmlnLmFzcCA9IDF9CmRfbG9uZ19zdWJzY2FsZV9ib290ICU+JQogIGZpbHRlcighZ3JlcGwoInRoYWkiLCBzdWJzY2FsZSkpICU+JSAKICBtdXRhdGUoc3Vic2NhbGUgPSBpZmVsc2Uoc3Vic2NhbGUgPT0gImlubmVyIHNwZWVjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlKGFzLmNoYXJhY3RlcihzdWJzY2FsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzdWIoInBhY2tldCAiLCAicCIsIHBhY2tldCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcCA9ICJfIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3RlcihzdWJzY2FsZSkpKSAlPiUKICBkaXN0aW5jdChjdHJ5LCBzdWJzY2FsZSwgTWVhbikgJT4lCiAgdW5ncm91cCgpICU+JQogIHNwcmVhZChzdWJzY2FsZSwgTWVhbikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygiY3RyeSIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIikgJT4lCiAgIyBjb3JycGxvdCB2ZXJzaW9uOgogICMgY29ycnBsb3Q6OmNvcnJwbG90KG1ldGhvZCA9ICJjb2xvciIsIHRsLmNvbCA9ICJibGFjayIsCiAgIyAgICAgICAgICAgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCBvcmRlciA9ICJoY2x1c3QiLAogICMgICAgICAgICAgICAgICAgICAgIGNvbCA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAiUFJHbiIpLAogICMgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlxuY29ycmVsYXRpb25zIGJldHdlZW4gc3Vic2NhbGUgbWVhbnMgKGJ5IGNvdW50cnkpLCBvcmRlcmVkIGJ5IGhpZXJhcmNoaWNhbCBjbHVzdGVyaW5nIikKCiAgIyBnZ3Bsb3QgdmVyc2lvbjoKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJzY2FsZUEiKSAlPiUKICBtdXRhdGUoc3Vic2NhbGVBX29yZGVyID0gYXMubnVtZXJpYyhmYWN0b3IoYXMubnVtZXJpYyhmYWN0b3Ioc3Vic2NhbGVBKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGNsdXN0X3N1YnNjYWxlcyRvcmRlcikpKSAlPiUKICBnYXRoZXIoc3Vic2NhbGVCLCBjb3IsIC1zdWJzY2FsZUEsIC1zdWJzY2FsZUFfb3JkZXIpICU+JQogIG11dGF0ZShzdWJzY2FsZUJfb3JkZXIgPSBhcy5udW1lcmljKGZhY3Rvcihhcy5udW1lcmljKGZhY3RvcihzdWJzY2FsZUIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gY2x1c3Rfc3Vic2NhbGVzJG9yZGVyKSkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoc3Vic2NhbGVBLCBkZXNjKHN1YnNjYWxlQV9vcmRlcikpLCAKICAgICAgICAgICAgIHkgPSByZW9yZGVyKHN1YnNjYWxlQiwgZGVzYyhzdWJzY2FsZUJfb3JkZXIpKSwgCiAgICAgICAgICAgICBmaWxsID0gY29yLCBsYWJlbCA9IHJvdW5kMihjb3IpKSkgKwogIGdlb21fdGlsZSgpICsKICBnZW9tX3RleHQoc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDUwKSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJjb3JyZWxhdGlvbnMgYW1vbmcgbWVhbiBzdWJzY2FsZSBzY29yZXMsIGJ5IHNpdGUiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgcGFpcndpc2UgY29tcGxldGUgb2JzZXJ2YXRpb25zXG5vcmRlcmVkIHZpYSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyBhbmFseXNpcyIsCiAgICAgICBmaWxsID0gImNvcnJlbGF0aW9uXG5jb2VmZi4gKHIpIiwKICAgICAgIHggPSAiIiwKICAgICAgIHkgPSAiIikKYGBgCgojIExvb2sgYXQgY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyBieSBpbmRpdmlkdWFscwoKV2UgY291bGQgZG8gdGhlIHNhbWUgdGhpbmcgdGhpbmtpbmcgYWJvdXQgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMgaW5zdGVhZCBvZiBzaXRlcyAtIGJ1dCBpdCdzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCBtb3N0IHBlb3BsZSBkaWRuJ3QgZmlsbCBvdXQgYWxsIGByIGxlbmd0aChsZXZlbHMoZmFjdG9yKGRfbG9uZ19zdWJzY2FsZSRzdWJzY2FsZSkpKSAtIDFgIHN1YnNjYWxlcyEgU28gd2UnbGwgZm9jdXMgb24ganVzdCBsb29raW5nIGF0IGhvdyB0aGUgc3Vic2NhbGVzIHdpdGhpbiBlYWNoIHBhY2tldCAoUGFja2V0IDEsIDIsIG9yIDMpICJoYW5nIHRvZ2V0aGVyIiBmb3IgdGhlIHBlb3BsZSB3aG8gY29tcGxldGVkIHRoYXQgcGFja2V0LgoKQXMgYWJvdmUsIHRvIHJlYWQgdGhlc2UgcGxvdHMsIGZpbmQgb25lIHNjYWxlIG9uIHRoZSB4LWF4aXMsIGFuZCBhbm90aGVyIHNjYWxlIG9uIHRoZSB5LWF4aXMuIFRoZSB2YWx1ZSAoYW5kIGNvbG9yKSBhdCB0aGF0IHBvaW50IGluIHRoZSBncmlkIHNob3dzIHlvdSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0aGVzZSB0d28gc3Vic2NhbGUgbWVhbnMgYWNyb3NzIHRoZSA1IHNpdGVzLiBUaGUgbWF4aW11bSBwb3NzaWJsZSBjb3JyZWxhdGlvbiBpcyArMSAocmVkKSwgYW5kIHRoZSBtaW5pbXVtIGlzIC0xIChibHVlKS4gKE5vdGUgdGhhdCB0aGVzZSBzY2FsZXMgYXJlIGJlaW5nIHByZXNlbnRlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIsICpub3QqIGJ5IGFueSBzb3J0IG9mIGNsdXN0ZXJpbmcgYW5hbHlzaXMuKQoKIyMgUGFja2V0IDEKCmBgYHtyIGZpZy53aWR0aCA9IDMsIGZpZy5hc3AgPSAxfQpkX2xvbmdfc3Vic2NhbGUgJT4lCiAgZmlsdGVyKHBhY2tldCA9PSAxLCAhaXMubmEoc3VtX3Njb3JlKSkgJT4lCiAgc3ByZWFkKHN1YnNjYWxlLCBzdW1fc2NvcmUpICU+JQogIHNlbGVjdCgtYyhjdHJ5LCB3aGVyLCByZWNyLCB3aG9jLCBhdHRuKSkgJT4lCiAgbXV0YXRlKHN1YmogPSBwYXN0ZShzdWJqLCBwYWNrZXQsIHZlcnNpb24sIHNlcCA9ICJfIikpICU+JQogIHNlbGVjdCgtcGFja2V0LCAtdmVyc2lvbikgJT4lCiAgZGlzdGluY3QoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKSAlPiUKICBjb3IodXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpICU+JQogICMgY29ycnBsb3QgdmVyc2lvbjoKICAjIGNvcnJwbG90Ojpjb3JycGxvdChtZXRob2QgPSAiY29sb3IiLCB0bC5jb2wgPSAiYmxhY2siLAogICMgICAgICAgICAgICAgICAgICAgIGFkZENvZWYuY29sID0gImJsYWNrIiwgb3JkZXIgPSAiaGNsdXN0IiwKICAjICAgICAgICAgICAgICAgICAgICBjb2wgPSBSQ29sb3JCcmV3ZXI6OmJyZXdlci5wYWwobiA9IDExLCBuYW1lID0gIlBSR24iKSwKICAjICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJcblBBQ0tFVCAxOiBjb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2NhbGVzIikKCiAgIyBnZ3Bsb3QgdmVyc2lvbjoKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJzY2FsZUEiKSAlPiUKICBnYXRoZXIoc3Vic2NhbGVCLCBjb3IsIC1zdWJzY2FsZUEpICU+JQogIGdncGxvdChhZXMoeCA9IHN1YnNjYWxlQSwgeSA9IHN1YnNjYWxlQiwgZmlsbCA9IGNvciwgbGFiZWwgPSByb3VuZDIoY29yKSkpICsKICBnZW9tX3RpbGUoKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAzKSArCiAgc2NhbGVfZmlsbF9kaXN0aWxsZXIoZ3VpZGUgPSBndWlkZV9jb2xvcmJhcihiYXJoZWlnaHQgPSA2KSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIlJkWWxCdSIsIGxpbWl0cyA9IGMoLTEsIDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQQUNLRVQgMTogY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJ1c2luZyBwYWlyd2lzZSBjb21wbGV0ZSBvYnNlcnZhdGlvbnMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICIiKQpgYGAKCiMjIFBhY2tldCAyCgpgYGB7ciBmaWcud2lkdGggPSAzLCBmaWcuYXNwID0gMX0KZF9sb25nX3N1YnNjYWxlICU+JQogIGZpbHRlcihwYWNrZXQgPT0gMiwgIWlzLm5hKHN1bV9zY29yZSkpICU+JQogIHNwcmVhZChzdWJzY2FsZSwgc3VtX3Njb3JlKSAlPiUKICBzZWxlY3QoLWMoY3RyeSwgd2hlciwgcmVjciwgd2hvYywgYXR0bikpICU+JQogIG11dGF0ZShzdWJqID0gcGFzdGUoc3ViaiwgcGFja2V0LCB2ZXJzaW9uLCBzZXAgPSAiXyIpKSAlPiUKICBzZWxlY3QoLXBhY2tldCwgLXZlcnNpb24pICU+JQogIGRpc3RpbmN0KCkgJT4lCiAgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lCiAgY29sdW1uX3RvX3Jvd25hbWVzKCJzdWJqIikgJT4lCiAgY29yKHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKSAlPiUKICAjIGNvcnJwbG90IHZlcnNpb246CiAgIyBjb3JycGxvdDo6Y29ycnBsb3QobWV0aG9kID0gImNvbG9yIiwgdGwuY29sID0gImJsYWNrIiwKICAjICAgICAgICAgICAgICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsIG9yZGVyID0gImhjbHVzdCIsCiAgIyAgICAgICAgICAgICAgICAgICAgY29sID0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKG4gPSAxMSwgbmFtZSA9ICJQUkduIiksCiAgIyAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiXG5QQUNLRVQgMjogY29ycmVsYXRpb25zIGFtb25nIHN1YnNjYWxlcyIpCgogICMgZ2dwbG90IHZlcnNpb246CiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3Vic2NhbGVBIikgJT4lCiAgZ2F0aGVyKHN1YnNjYWxlQiwgY29yLCAtc3Vic2NhbGVBKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzdWJzY2FsZUEsIHkgPSBzdWJzY2FsZUIsIGZpbGwgPSBjb3IsIGxhYmVsID0gcm91bmQyKGNvcikpKSArCiAgZ2VvbV90aWxlKCkgKwogIGdlb21fdGV4dChzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNiksCiAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUEFDS0VUIDI6IGNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzY2FsZXMiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgcGFpcndpc2UgY29tcGxldGUgb2JzZXJ2YXRpb25zIiwKICAgICAgIHggPSAiIiwKICAgICAgIHkgPSAiIikKYGBgCgojIyBQYWNrZXQgMwoKYGBge3IgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDF9CmRfbG9uZ19zdWJzY2FsZSAlPiUKICBmaWx0ZXIocGFja2V0ID09IDMsICFpcy5uYShzdW1fc2NvcmUpKSAlPiUKICBzcHJlYWQoc3Vic2NhbGUsIHN1bV9zY29yZSkgJT4lCiAgc2VsZWN0KC1jKGN0cnksIHdoZXIsIHJlY3IsIHdob2MsIGF0dG4pKSAlPiUKICBtdXRhdGUoc3ViaiA9IHBhc3RlKHN1YmosIHBhY2tldCwgdmVyc2lvbiwgc2VwID0gIl8iKSkgJT4lCiAgc2VsZWN0KC1wYWNrZXQsIC12ZXJzaW9uKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIikgJT4lCiAgIyBjb3JycGxvdCB2ZXJzaW9uOgogICMgY29ycnBsb3Q6OmNvcnJwbG90KG1ldGhvZCA9ICJjb2xvciIsIHRsLmNvbCA9ICJibGFjayIsCiAgIyAgICAgICAgICAgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCBvcmRlciA9ICJoY2x1c3QiLAogICMgICAgICAgICAgICAgICAgICAgIGNvbCA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAiUFJHbiIpLAogICMgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIlxuUEFDS0VUIDM6IGNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzY2FsZXMiKQoKICAjIGdncGxvdCB2ZXJzaW9uOgogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YnNjYWxlQSIpICU+JQogIGdhdGhlcihzdWJzY2FsZUIsIGNvciwgLXN1YnNjYWxlQSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc3Vic2NhbGVBLCB5ID0gc3Vic2NhbGVCLCBmaWxsID0gY29yLCBsYWJlbCA9IHJvdW5kMihjb3IpKSkgKwogIGdlb21fdGlsZSgpICsKICBnZW9tX3RleHQoc2l6ZSA9IDMpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihndWlkZSA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDYpLAogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiUmRZbEJ1IiwgbGltaXRzID0gYygtMSwgMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBBQ0tFVCAzOiBjb3JyZWxhdGlvbnMgYW1vbmcgc3Vic2NhbGVzIiwKICAgICAgIHN1YnRpdGxlID0gInVzaW5nIHBhaXJ3aXNlIGNvbXBsZXRlIG9ic2VydmF0aW9ucyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIiIpCmBgYAoKIyMgQWxsIHBhY2tldHMKCkp1c3QgZm9yIGZ1biwgaGVyZSdzIGEgbG9vayBhdCB0aGUgY29ycmVsYXRpb25zIGFtb25nIGluZGl2aWR1YWwgcGFydGljaXBhbnRzJyBzdWJzY2FsZSBzY29yZXMgYWNyb3NzIGFsbCBzY2FsZXMuICoqTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgcGFpcnMgb2Ygc3Vic2NhbGVzIHByb2JhYmx5IGhhdmUgdmVyeSBmZXcgb2JzZXJ2YXRpb25zIGdvaW5nIGludG8gdGhlc2UgY29ycmVsYXRpb25zISEgU28gdGFrZSB0aGlzIHdpdGggYSBncmFpbiBvZiBzYWx0LioqCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDF9CmRfbG9uZ19zdWJzY2FsZSAlPiUKICBzcHJlYWQoc3Vic2NhbGUsIHN1bV9zY29yZSkgJT4lCiAgc2VsZWN0KC1jKGN0cnksIHdoZXIsIHJlY3IsIHdob2MsIGF0dG4pKSAlPiUKICBtdXRhdGUoc3ViaiA9IHBhc3RlKHN1YmosIHBhY2tldCwgdmVyc2lvbiwgc2VwID0gIl8iKSkgJT4lCiAgc2VsZWN0KC1wYWNrZXQsIC12ZXJzaW9uKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaiIpICU+JQogIGNvcih1c2UgPSAicGFpcndpc2UuY29tcGxldGUub2JzIikgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3Vic2NhbGVBIikgJT4lCiAgZ2F0aGVyKHN1YnNjYWxlQiwgY29yLCAtc3Vic2NhbGVBKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBzdWJzY2FsZUEsIHkgPSBzdWJzY2FsZUIsIGZpbGwgPSBjb3IsIGxhYmVsID0gcm91bmQyKGNvcikpKSArCiAgZ2VvbV90aWxlKCkgKwogIGdlb21fdGV4dChzaXplID0gMykgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKGd1aWRlID0gZ3VpZGVfY29sb3JiYXIoYmFyaGVpZ2h0ID0gNiksCiAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJSZFlsQnUiLCBsaW1pdHMgPSBjKC0xLCAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUEFDS0VUUyAxLTM6IGNvcnJlbGF0aW9ucyBhbW9uZyBzdWJzY2FsZXMiLAogICAgICAgc3VidGl0bGUgPSAidXNpbmcgcGFpcndpc2UgY29tcGxldGUgb2JzZXJ2YXRpb25zIiwKICAgICAgIHggPSAiIiwKICAgICAgIHkgPSAiIikKYGBgCgojIEZvY3VzaW5nIG9uIGFic29ycHRpb24gJiBzcGlyaXR1YWwgZXZlbnRzCgpMZXQncyBsb29rIGF0IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBhYnNvcnB0aW9uICYgc3Bpcml0dWFsIGV2ZW50cyBhY3Jvc3MgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudHMsIGJ1dCBzZXBhcmF0aW5nIG91dCBieSBzaXRlLiBUYW55YSdzIHN0cm9uZyBwcmVkaWN0aW9uIHdvdWxkIGJlIHRoYXQgaGlnaGVyIGFic29ycHRpb24gKGFzIGNhcHR1cmVkIGJ5IHRoZSBUZWxsZWdlbiBzY2FsZSwgYGV4d2xgKSB3b3VsZCBiZSBjb3JyZWxhdGVkIHdpdGggbW9yZSBzcGlyaXR1YWwgZXZlbnRzIChhcyBpbmR4ZWQgYnkgdGhlIEx1aHJtYW5uIHNjYWxlLCBgc3BldmApLgoKSGVyZSdzIGEgdGVzdCBmb3IgdGhlIG92ZXJhbGwgY29ycmVsYXRpb246CgpgYGB7cn0KY29yMSA8LSB3aXRoKGRfd2lkZV9zdWJzY2FsZSwgY29yLnRlc3QoZXh3bCwgc3BldikpOyBjb3IxCmBgYAoKTG9va3MgbGlrZSB0aGlzIHByZWRpY3Rpb24gaXMgYm9ybiBvdXQgYnkgdGhlIGRhdGEhIEFic29ycHRpb24gd2FzIHNpZ25pZmljYW50bHkgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggcmVwb3J0ZWQgc3Bpcml0dWFsIGV2ZW50cyAoJHIkID0gYHIgcm91bmQyKGNvcjEkZXN0aW1hdGUpYCwgJHAkID0gYHIgaWZlbHNlKGNvcjEkcC52YWx1ZSA8IDAuMDAxLCAiPDAuMDAxIiwgZm9ybWF0KHJvdW5kKGNvcjEkcC52YWx1ZSwgMyksIGRpZ2l0cyA9IDMpKWApLCBhY2NvdW50aW5nIGZvciBhcHByb3hpbWF0ZWx5IGByIHJvdW5kKGNvcjEkZXN0aW1hdGVeMiAqIDEwMClgJSBvZiB0aGUgdmFyaWFuY2UgaW4gcmVwb3J0ZWQgc3BpcnR1YWwgZXZlbnRzLgoKTm93IGxldCdzIHRha2UgYSBsb29rIGF0IHdoYXQncyBnb2luZyBvbiBpbiBlYWNoIHNpdGUgd2l0aCBhIHJlZ3Jlc3Npb24gYW5hbHlzaXM6CgpgYGB7ciwgcmVzdWx0cyA9ICJhc2lzIn0KIyBlZmZlY3QtY29kZSBzaXRlCmNvbnRyYXN0cyhkX3dpZGVfc3Vic2NhbGUkY3RyeSkgPC0gY2JpbmQoZ2hhbmEgPSBjKC0xLCAxLCAwLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFpbGFuZCA9IGMoLTEsIDAsIDEsIDAsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaW5hID0gYygtMSwgMCwgMCwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFudWF0dSA9IGMoLTEsIDAsIDAsIDAsIDEpKQoKcjEgPC0gbG0oc3BldiB+IGV4d2xfY2VudCAqIGN0cnksIAogICAgICAgICBkX3dpZGVfc3Vic2NhbGUgJT4lIG11dGF0ZShleHdsX2NlbnQgPSBzY2FsZShleHdsLCBzY2FsZSA9IEYpKSkKCnIxX2NvZWYgPC0gc3VtbWFyeShyMSkkY29lZmZpY2llbnRzICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInBhcmFtIikgJT4lCiAgcmVuYW1lKGIgPSBFc3RpbWF0ZSwgc2UgPSBTdGQuLkVycm9yLCB0ID0gdC52YWx1ZSwgcCA9IFByLi4udC4uKSAlPiUKICBtdXRhdGVfYXQodmFycyhiLCBzZSwgdCksIGZ1bnMocm91bmQyKSkgJT4lCiAgbXV0YXRlKHAgPSBpZmVsc2UocCA8IDAuMDAxLCAiPDAuMDAxIiwKICAgICAgICAgICAgICAgICAgICBmb3JtYXQocm91bmQocCwgMyksIGRpZ2l0cyA9IDMpKSwKICAgICAgICAgcGFyYW0gPSBmYWN0b3IocGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIihJbnRlcmNlcHQpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN0cnlnaGFuYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdHJ5dGhhaWxhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdHJ5Y2hpbmEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3RyeXZhbnVhdHUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh3bF9jZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh3bF9jZW50OmN0cnlnaGFuYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHdsX2NlbnQ6Y3RyeXRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4d2xfY2VudDpjdHJ5Y2hpbmEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh3bF9jZW50OmN0cnl2YW51YXR1IiksCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImJhc2VyYXRlIChvdmVyYWxsKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlcmF0ZSAoZ2hhbmEgdnMuIG92ZXJhbGwpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzZXJhdGUgKHRoYWlsYW5kIHZzLiBvdmVyYWxsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2VyYXRlIChjaGluYSB2cy4gb3ZlcmFsbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlcmF0ZSAodmFudWF0dSB2cy4gb3ZlcmFsbCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYnNvcnB0aW9uIChvdmVyYWxsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic29ycHRpb24gKGdoYW5hIHZzLiBvdmVyYWxsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic29ycHRpb24gKHRoYWlsYW5kIHZzLiBvdmVyYWxsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic29ycHRpb24gKGNoaW5hIHZzLiBvdmVyYWxsKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic29ycHRpb24gKHZhbnVhdHUgdnMuIG92ZXJhbGwpIikpKSAlPiUKICBhcnJhbmdlKHBhcmFtKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInBhcmFtIikKCmtuaXRyOjprYWJsZShyMV9jb2VmKQpgYGAKClRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCwgYXMgcHJlZGljdGVkLCB0aGVyZSB3YXMgYSBzaWduaWZpY2FudCBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhYnNvcnB0aW9uIGFuZCByZXBvcnRlZCBzcGlyaXR1YWwgZXZlbnRzLCBjb2xsYXBzaW5nIGFjcm9zcyBzaXRlcyAoJGIkID0gYHIgcjFfY29lZlsiYWJzb3JwdGlvbiAob3ZlcmFsbCkiLCAiYiJdYCwgJHAkID0gYHIgcjFfY29lZlsiYWJzb3JwdGlvbiAob3ZlcmFsbCkiLCAicCJdYCkuIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhYnNvcnB0aW9uIGFuZCBzcGlyaXR1YWwgZXZlbnRzIHdhcyBwYXJ0aWN1bGFybHkgc3Ryb25nIGFtb25nIHBhcnRpY2lwYW50cyBpbiBHaGFuYSAoJGIkID0gYHIgcjFfY29lZlsiYWJzb3JwdGlvbiAoZ2hhbmEgdnMuIG92ZXJhbGwpIiwgImIiXWAsICRwJCA9IGByIHIxX2NvZWZbImFic29ycHRpb24gKGdoYW5hIHZzLiBvdmVyYWxsKSIsICJwIl1gKSwgYW5kIChwZXJoYXBzKSB3ZWFrZXIgdGhhbiBhdmVyYWdlIGFtb25nIHBhcnRpY2lwYW50cyBpbiBDaGluYSAoJGIkID0gYHIgcjFfY29lZlsiYWJzb3JwdGlvbiAoY2hpbmEgdnMuIG92ZXJhbGwpIiwgImIiXWAsICRwJCA9IGByIHIxX2NvZWZbImFic29ycHRpb24gKGNoaW5hIHZzLiBvdmVyYWxsKSIsICJwIl1gKS4KCk5vdGUgYWxzbyB0aGF0IHRoZXJlIGFyZSBvdmVyYWxsIGRpZmZlcmVuY2VzIGluIHRoZSBiYXNlcmF0ZXMgZm9yIHJlcG9ydGluZyBzcGlyaXR1YWwgZXZlbnRzOiBQYXJ0aWNpcGFudHMgaW4gR2hhbmEgYW5kIFZhbnVhdHUgZ2VuZXJhbGx5IHJlcG9ydGVkIG1vcmUgdGhhbiBhdmVyYWdlIChHaGFuYTogJGIkID0gYHIgcjFfY29lZlsiYmFzZXJhdGUgKGdoYW5hIHZzLiBvdmVyYWxsKSIsICJiIl1gLCAkcCQgPSBgciByMV9jb2VmWyJiYXNlcmF0ZSAoZ2hhbmEgdnMuIG92ZXJhbGwpIiwgInAiXWA7IFZhbnVhdHU6ICRiJCA9IGByIHIxX2NvZWZbImJhc2VyYXRlICh2YW51YXR1IHZzLiBvdmVyYWxsKSIsICJiIl1gLCAkcCQgPSBgciByMV9jb2VmWyJiYXNlcmF0ZSAodmFudWF0dSB2cy4gb3ZlcmFsbCkiLCAicCJdYCksIHdoaWxlIHBhcnRpY2lwYW50cyBpbiBUaGFpbGFuZCBhbmQgQ2hpbmEgZ2VuZXJhbGx5IHJlcG9ydGVkIGZld2VyIHRoYW4gYXZlcmFnZSAoVGhhaWxhbmQ6ICRiJCA9IGByIHIxX2NvZWZbImJhc2VyYXRlICh0aGFpbGFuZCB2cy4gb3ZlcmFsbCkiLCAiYiJdYCwgJHAkID0gYHIgcjFfY29lZlsiYmFzZXJhdGUgKHRoYWlsYW5kIHZzLiBvdmVyYWxsKSIsICJwIl1gOyBDaGluYTogJGIkID0gYHIgcjFfY29lZlsiYmFzZXJhdGUgKGNoaW5hIHZzLiBvdmVyYWxsKSIsICJiIl1gLCAkcCQgPSBgciByMV9jb2VmWyJiYXNlcmF0ZSAoY2hpbmEgdnMuIG92ZXJhbGwpIiwgInAiXWApLgoKSGVyZSdzIGEgdmlzdWFsaXphdGlvbiBvZiB0aGVzZSByZWxhdGlvbnNoaXBzOgoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjM3NX0KZ2dwbG90KGRfd2lkZV9zdWJzY2FsZSAlPiUKICAgICAgICAgZmlsdGVyKCFpcy5uYShleHdsKSwgIWlzLm5hKHNwZXYpKSAlPiUKICAgICAgICAgbXV0YXRlKGN0cnkgPSBmYWN0b3IoY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInVzIiwgImdoYW5hIiwgInRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoaW5hIiwgInZhbnVhdHUiKSksCiAgICAgICAgICAgICAgICBleHdsX2NlbnQgPSBzY2FsZShleHdsLCBzY2FsZSA9IEYpKSwKICAgICAgIGFlcyh4ID0gZXh3bCwgIyB4ID0gZXh3bF9jZW50LCAKICAgICAgICAgICB5ID0gc3BldiwgY29sb3IgPSBjdHJ5KSkgKwogIGZhY2V0X2dyaWQofiBjdHJ5KSArCiAgZ2VvbV9wb2ludChzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJibGFjayIpICsKICAjIGdlb21fbGluZShkYXRhID0gZm9ydGlmeShyMSksIGFlcyh4ID0gZXh3bF9jZW50LCB5ID0gLmZpdHRlZCksIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHhsaW0oMCwgMzQpICsKICB5bGltKDAsIDg4KSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gInJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFic29ycHRpb24gJiBzcGlyaXR1YWwgZXZlbnRzLCBieSBzaXRlIiwKICAgICAgIGNvbG9yID0gInNpdGUiLAogICAgICAgeCA9ICJhYnNvcnB0aW9uICh0ZWxsZWdlbikiLAogICAgICAgeSA9ICJzcGlyaXR1YWwgZXZlbnRzIChsdWhybWFubikiKQpgYGAKCiMgRHVhbGlzbQoKSGVyZSdzIGp1c3Qgc29tZSBpbml0aWFsIGF0dGVtcHQgdG8gdGFrZSBhIGxvb2sgYXQgaG93IHRoZSBkdWFsaXNtIHF1ZXN0aW9ucyBoYW5nIHRvZ2V0aGVyLi4uIG1vcmUgb24gdGhpcyBsYXRlci4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMX0KbGlicmFyeShnZ2RlbmRybykKdGVtcCA8LSBkX2xvbmcgJT4lCiAgZmlsdGVyKGdyZXBsKCJtaW53XyIsIHF1ZXN0aW9uKSwgIWlzLm5hKHJlc3BvbnNlKSkgJT4lCiAgc2VsZWN0KHN1YmosIHF1ZXN0aW9uLCByZXNwb25zZSkgJT4lCiAgbGVmdF9qb2luKHF1ZXN0aW9uX2tleSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCwgCiAgICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uX3RleHQsIGJ5aGFuZF9zdWJzY2FsZSkgJT4lIAogICAgICAgICAgICAgIHJlbmFtZShxdWVzdGlvbiA9IHF1ZXN0aW9uX2xhYmVsX3VuaXZlcnNhbCkpICU+JQogIGRpc3RpbmN0KHN1YmosIHF1ZXN0aW9uX3RleHQsIHJlc3BvbnNlKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcmVzcG9uc2UpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmoiKQogIAp0ZW1wX2NsdXN0IDwtIGhjbHVzdChkaXN0KHQodGVtcCkpKQpnZ2RlbmRyb2dyYW0odGVtcF9jbHVzdCwgcm90YXRlID0gVFJVRSkKYGBgCgo=